import 'dart:async';
import 'dart:io';
import 'dart:typed_data';


/*
class RealtimePcmToMp3Converter {
  final String outputPath;
  final int sampleRate;
  final int numChannels;
  final int bitsPerSample;

// MP3 音质参数（0-9，0 为最佳音质，9 为最小体积）
  final int audioQuality;

  late StreamController<Uint8List> _pcmStreamController;
  late FFmpegSession? _ffmpegSession;
  bool _isInitialized = false;
  bool _isFinalized = false;

  RealtimePcmToMp3Converter ({
    required this.outputPath,
    this.sampleRate = 44100,
    this.numChannels = 1,
    this.bitsPerSample = 16,
    this.audioQuality = 5, // 平衡音质和体积的默认值
  }) {
    _validateParameters ();
    _initialize ();
  }

// 验证输入参数合法性
  void _validateParameters () {
    if (audioQuality < 0 || audioQuality> 9) {
      throw ArgumentError ("音频质量参数必须在 0-9 之间");
    }
    if (![8, 16, 32].contains (bitsPerSample)) {
      throw ArgumentError ("仅支持 8/16/32 位深的 PCM 数据");
    }
    if (numChannels < 1 || numChannels > 2) {
      throw ArgumentError ("声道数必须为 1（单声道）或 2（立体声）");
    }
  }

// 初始化 FFmpeg 编码会话和数据流
  Future<void> _initialize () async {
// 创建 PCM 数据流控制器
    _pcmStreamController = StreamController<Uint8List>();

// 根据位深获取 FFmpeg 支持的 PCM 格式标识
    final pcmFormat = _getPcmFormat ();

// 启动 FFmpeg 实时编码会话
    _ffmpegSession = await FFmpegUtils.startStreamConversion (
      inputStream: _pcmStreamController.stream,
      outputPath: outputPath,
      inputFormat: pcmFormat,
// 配置 PCM 输入参数
      inputArguments: [
        '-f', pcmFormat, // PCM 格式（如 s16le）
        '-ar', sampleRate.toString (), // 采样率
        '-ac', numChannels.toString (), // 声道数
        '-i', 'pipe:0', // 从标准输入管道读取数据
      ],
// 配置 MP3 输出参数
      outputArguments: [
        '-codec:a', 'libmp3lame', // 使用 LAME MP3 编码器
        '-q:a', audioQuality.toString (),// 音质参数
        '-y', // 覆盖已存在的输出文件
      ],
    );

    _isInitialized = true;
  }

// 写入 PCM 数据块（实时编码）
  void writeChunk (Uint8List pcmData) {
    if (!_isInitialized || _isFinalized) {
      throw StateError ("转换器未初始化或已关闭");
    }

// 验证 PCM 数据长度与位深匹配（避免编码错误）
    final bytesPerSample = bitsPerSample ~/ 8;
    if (pcmData.length % (bytesPerSample * numChannels) != 0) {
      throw FormatException (
          "PCM 数据长度与位深 / 声道数不匹配，应为 ${bytesPerSample * numChannels} 的倍数"
      );
    }

// 将 PCM 数据加入流中，由 FFmpeg 处理
    _pcmStreamController.add (pcmData);
  }

// 完成编码并释放资源
  Future<void> finalize() async {
    if (_isFinalized) return;

    _isFinalized = true;
// 关闭输入流，通知 FFmpeg 数据已写完
    await _pcmStreamController.close ();
// 等待 FFmpeg 完成编码并写入文件
    if (_ffmpegSession != null) {
      await _ffmpegSession?.waitForCompletion ();
    }
  }

// 根据位深获取 FFmpeg 对应的 PCM 格式标识
  String _getPcmFormat () {
    switch (bitsPerSample) {
      case 8:
        return 'u8'; // 8 位无符号 PCM
      case 16:
        return's16le'; // 16 位有符号小端 PCM（最常用）
      case 32:
        return's32le'; // 32 位有符号小端 PCM
      default:
        throw UnsupportedError ("不支持的位深: $bitsPerSample");
    }
  }

// 取消编码并清理资源（用于异常情况）
  void cancel () {
    if (!_isFinalized) {
      _pcmStreamController.close ();
      _ffmpegSession?.cancel ();
      _isFinalized = true;
    }
  }
}*/
